<?php
namespace Pay\Controller;
use Common\Controller\HomebaseController;

/**
 * 支付宝支付
 * date: 2016.11.125
 * author： hongweizhiyuan
 */
class AlipayController extends HomebaseController {


	/*
	 * doalipay方法-测试环境
	 * 该方法其实就是将接口文件包下alipayapi.php的内容复制过来 然后进行相关处理
	 */
	public function doalipay_test($out_trade_no) {

		/**
		 * ************************配置参数*************************
		 */
		$alipay_config = C('alipay_config');
		$payment_type = "1"; // 支付类型 //必填，不能修改
		$notify_url = C('alipay.notify_url'); // 服务器异步通知页面路径
		$return_url = C('alipay.return_url'); // 页面跳转同步通知页面路径
		$seller_email = C('alipay.seller_email'); // 卖家支付宝帐户必填
		/**
		 * ************************数据库传递参数*************************
		 */
		$out_trade_no = '11111';//商户订单号 通过支付页面的表单进行传递，注意要唯一！
		$subject = '我靠我测试测试';  //订单名称 //必填 通过支付页面的表单进行传递
		$total_fee ='100';   //付款金额  //必填 通过支付页面的表单进行传递
		$body = '缪果';  //订单描述 通过支付页面的表单进行传递
		$show_url = '11';  //商品展示地址 通过支付页面的表单进行传递

		$anti_phishing_key = ""; // 防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
		$exter_invoke_ip = get_client_ip(); // 客户端的IP地址

		// 构造要请求的参数数组，无需改动
		$parameter = array(
			"service" => "create_direct_pay_by_user",
			"partner" => trim($alipay_config['partner']),
			"payment_type" => $payment_type,
			"notify_url" => $notify_url,
			"return_url" => $return_url,
			"seller_email" => $seller_email,
			"out_trade_no" => $out_trade_no,
			"subject" => $subject,
			"total_fee" => $total_fee,
			"body" => $body,
			"show_url" => $show_url,
			"anti_phishing_key" => $anti_phishing_key,
			"exter_invoke_ip" => $exter_invoke_ip,
			"_input_charset" => trim(strtolower($alipay_config['input_charset']))
		);

		// 建立请求
		$alipaySubmit = new \Pay\Lib\AlipaySubmit($alipay_config);
		$html_text = $alipaySubmit->buildRequestForm($parameter, "post", "确认");
		echo $html_text;
	}

	/*
	 * doalipay方法-生产环境
	 * 该方法其实就是将接口文件包下alipayapi.php的内容复制过来 然后进行相关处理
	 */
	public function doalipay() {
		
		/**
		 * ************************配置参数*************************
		 */
		$alipay_config = C('alipay_config');
		$payment_type = "1"; // 支付类型 //必填，不能修改
		$notify_url = C('alipay.notify_url'); // 服务器异步通知页面路径
		$return_url = C('alipay.return_url'); // 页面跳转同步通知页面路径
		$seller_email = C('alipay.seller_email'); // 卖家支付宝帐户必填
		/**
		 * ************************数据库传递参数*************************
		 */
		$out_trade_no =I('order_sn'); // 商户订单号 通过支付页面的表单进行传递，注意要唯一！
		$subject = I('goods_name'); // 订单名称 //必填 通过支付页面的表单进行传递
		$total_fee = I('total_price'); // 付款金额 //必填 通过支付页面的表单进行传递
		$body = I('content'); // 订单描述 通过支付页面的表单进行传递
		$show_url = I('geturl'); // 商品展示地址 通过支付页面的表单进行传递
		
		$anti_phishing_key = ""; // 防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数
		$exter_invoke_ip = get_client_ip(); // 客户端的IP地址
		
		/**
		 * *********************将获取到的参数存入交易状态表中**********************
		 */

		// 将待支付状态存到数据表中
        $transaction_model = M("CourseOrder");
		$data['state'] = "1"; // 商品交易状态-待支付
        $where['order'] = $out_trade_no;
        $transaction_model->where($where)->save($data);


		// 构造要请求的参数数组，无需改动，以下是官方的
		$parameter = array(
		    "service" => "create_direct_pay_by_user",
            "partner" => trim($alipay_config['partner']),
            "payment_type" => $payment_type,
            "notify_url" => $notify_url,
            "return_url" => $return_url,
            "seller_email" => $seller_email,
            "out_trade_no" => $out_trade_no,
            "subject" => $subject,
            "total_fee" => $total_fee,
            "body" => $body,
            "show_url" => $show_url,
            "anti_phishing_key" => $anti_phishing_key,
            "exter_invoke_ip" => $exter_invoke_ip,
            "_input_charset" => trim(strtolower($alipay_config['input_charset']))
        );
		// 建立请求
		$alipaySubmit = new \Pay\Lib\AlipaySubmit($alipay_config);
		$html_text = $alipaySubmit->buildRequestForm($parameter, "post", "确认");
		echo $html_text;
	}
	
	
	/**
	 * ****************************
	 * 服务器异步通知页面方法
	 * 其实这里就是将notify_url.php文件中的代码复制过来进行处理
	 *
	 * *****************************
	 */
	function notifyurl() {
		/* 服务器后台通知,这个页面是程序后台运行的(买家和卖家都看不到),买家付完款后,支付宝会调用notify_url这个页面所在的页面并把相应的参数传 递到这个页面,这个页面根据支付宝传递过来的参数修改网站订单的状态,更新完订单后需要在页面上打印出一个success 给支付宝,如果反馈给支付宝的不是success,支付宝会继续调用这个页面. */
		// 这里还是通过C函数来读取配置项，赋值给$alipay_config
		$alipay_config = C('alipay_config');
		// 计算得出通知验证结果
		$alipayNotify = new \Pay\Lib\AlipayNotify($alipay_config);
		$verify_result = $alipayNotify->verifyNotify();
		if ($verify_result) {
			// 验证成功
			// 获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
			$out_trade_no = $_POST['out_trade_no']; // 商户订单号
			$trade_no = $_POST['trade_no']; // 支付宝交易号
			$trade_status = $_POST['trade_status']; // 交易状态
			$total_fee = $_POST['total_fee']; // 交易金额
			$notify_id = $_POST['notify_id']; // 通知校验ID。
			$notify_time = $_POST['notify_time']; // 通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。
			$buyer_email = $_POST['buyer_email']; // 买家支付宝帐号；
			$parameter = array(
				"out_trade_no" => $out_trade_no, // 商户订单编号；
				"trade_no" => $trade_no, // 支付宝交易号；
				"total_fee" => $total_fee, // 交易金额；
				"trade_status" => $trade_status, // 交易状态
				"notify_id" => $notify_id, // 通知校验ID。
				"notify_time" => $notify_time, // 通知的发送时间。
				"buyer_email" => $buyer_email, //买家支付宝帐号；
			);
			if ($_POST['trade_status'] == 'TRADE_FINISHED') { //普通即时到帐状态下

				//更改订单交易状态值 将支付宝返回数据存入交易状态表
                // 将“已支付”状态存到本地数据表中 start
                $transaction_model = M("CourseOrder");
                $parameter_json = json_encode($$parameter);
                $data['data'] = $parameter_json; //将支付宝返回数据全部存入
                $data['state'] = "2"; //将订单状态变为已经支付成功
                $where['order'] = $out_trade_no;
                $transaction_model->where($where)->save($data);
                // 将“已支付”状态存到本地数据表中 end
			} else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { //高级即时到帐状态下
                //更改订单交易状态值 将支付宝返回数据存入交易状态表
                // 将“已支付”状态存到本地数据表中 start
                $transaction_model = M("CourseOrder");
                $parameter_json = json_encode($$parameter);
                $data['data'] = $parameter_json; //将支付宝返回数据全部存入
                $data['state'] = "2"; //将订单状态变为已经支付成功
                $where['order'] = $out_trade_no;
                $transaction_model->where($where)->save($data);
                // 将“已支付”状态存到本地数据表中 end
				//if(!checkorderstatus($out_trade_no)){
				// orderhandle($parameter);
				//进行订单处理，并传送从支付宝返回的参数；
				// }
				
			}
			echo "success"; // 请不要修改或删除
			
		} else {
			// 验证失败
			echo "fail";
		}
	}
	/*
	 * 页面跳转处理方法； 这里其实就是将return_url.php这个文件中的代码复制过来，进行处理；
	 */
	function returnurl() {
		/* 买家付款成功后,如果接口中指定有return_url ,买家付完款后会跳到 return_url所在的页面,这个页面可以展示给客户看,这个页面只有付款成功才会跳转. */
		// 头部的处理跟上面两个方法一样，这里不罗嗦了！
		$alipay_config = C('alipay_config');
		$alipayNotify = new \Pay\Lib\AlipayNotify($alipay_config); // 计算得出通知验证结果
		$verify_result = $alipayNotify->verifyReturn();
		if ($verify_result) {
			// 验证成功
			// 获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表
			$out_trade_no = $_GET['out_trade_no']; // 商户订单号
			$trade_no = $_GET['trade_no']; // 支付宝交易号
			$trade_status = $_GET['trade_status']; // 交易状态
			$total_fee = $_GET['total_fee']; // 交易金额
			$notify_id = $_GET['notify_id']; // 通知校验ID。
			$notify_time = $_GET['notify_time']; // 通知的发送时间。
			$buyer_email = $_GET['buyer_email']; //买家支付宝帐号；
			$parameter = array("out_trade_no" => $out_trade_no, //商户订单编号；
			"trade_no" => $trade_no, //支付宝交易号；
			"total_fee" => $total_fee, //交易金额；
			"trade_status" => $trade_status, //交易状态
			"notify_id" => $notify_id, //通知校验ID。
			"notify_time" => $notify_time, //通知的发送时间。
			"buyer_email" => $buyer_email, //买家支付宝帐号
			);
			if ($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
				/* if(!checkorderstatus($out_trade_no)){
				 orderhandle($parameter);//进行订单处理，并传送从支付宝返回的参数；
				}*/
				$this->redirect(U('Portal/Signup/paysuccess', array('transaction_status' => 1, 'out_trade_no' => $out_trade_no))); //跳转到配置项中配置的支付成功页面；
				
			} else {
				// echo "trade_status=".$_GET['trade_status'];
				$this->redirect(U('Portal/Signup/payfailed', array('transaction_status' => 0, 'out_trade_no' => $out_trade_no))); //跳转到配置项中配置的支付失败页面；
				
			}
		} else {
			//验证失败
			//如要调试，请看alipay_notify.php页面的verifyReturn函数
			echo "支付失败！";
		}
	}

	// 支付成功
    public function success()
    {
        echo 'success';exit;
    }

    // 支付失败
    public function fail()
    {
        echo 'fail';exit;
    }
}
